운영체제 메모리 관리

Logical vs Physical Address

Logical Address( = virtual address)

  • 프로세스마다 독립적으로 가지는 주소 공간
  • 각 프로세스마다 0번지부터 시작
  • CPU가 보는 주소는 Logical Adress 이다.

Physical Address

  • 메모리에 실제 올라가는 물리적 메모리 주소공간
  • 논리적 메모리는 MMU에 의해 자동으로 변환되기 때문에 사용자는 물리적 주소를 알 수 없다.

MMU

MMU(Memory Management Unit)은 CPU가 메모리에 접근하는 것을 관리하는 컴퓨터 하드웨어 부품으로 가상 주소를 실제 물리주소로 변환 시키는 일을 한다.

MMU의 동작 순서

  1. TLB(변환색인 버퍼)에서 찾으려는 페이지가 존재하는지 찾고 있으면 반환 없으면 페이지 테이블을 탐색한다.
  2. 페이지 테이블을 참조하여 페이지 테이블 번호와 offset의 정보를 바탕으로 물리주소를 계산하여 반환한다.

메모리 영역과 프로세스의 할당

일반적으로 메모리는 OS가 실행되기 위해 커널이 올라가 있는 메모리 영역과 사용자가 프로그램을 실행할 수 있는 사용자 영역으로 나뉜다. 커널은 낮은 주소 영역을 사용하고 사용자는 높은 주소 영역을 사용한다.

사용자 프로세스는 사용자 영역에 할당되며 프로세스의 할당은 메모리 공간에 연속적으로 할당될 수 있고 불연속적으로 할당될 수 있다.

  • 연속적 할당 방법
    • 고정크기할당
      • 메모리를 모두 같은 크기의 영역으로 나누고 이 영역에 프로그램을 할당한다.
      • 융통성이 없기 때문에 최대 수행 가능한 프로그램 수가 제한적이다.
      • 고정 크기가 프로그램의 크기보다 클 경우 내부 단편화 문제 발생
    • 가변크기 할당
      • 프로그램에 따라 메모리의 영역을 동적으로 할당
      • 외부 단편화 문제 발생
  • 불연속적 할당 방법
    • 페이징
    • 세그먼테이션
    • 페이징 & 세그먼테이션

페이징

페이징이란 프로세스의 메모리 영역을 동일한 크기의 페이지로 나누어 관리하는 것을 말한다. 페이징을 통해 사용하지 않는 페이지를 디스크에 저장함으로써 사용자는 더 큰 메모리를 사용할 수 있다. 페이지를 디스크에 저장하기 때문에 사용해야 할 페이지가 메모리에 없을 경우 다시 메인 메모리로 불러와야 하는 과정이 필요하다.

  • 물리적으로는 프레임(frame) 논리적으로는 페이지(Page)로 동일한 크기로 나뉜다.
  • 페이지는 메모리 공간에 불연속적으로 적재될 수 있다. -> 불연속적인 페이지들의 실제 저장 위치를 계산하기 위한 페이지 테이블이 필요하다. PTBR(Page Table Base Register)라는 레지스터가 항상 페이지 테이블의 위치를 기억하고 있다.
  • 필요한 페이지는 메모리에 올라가고 사용되지 않는 페이지는 디스크에 저장될 수 있다. -> 이로 인해 실제 물리 메모리의 크기보다 더욱 큰 메모리를 사용할 수 있는 것처럼 보인다.
  • 자주 사용되는 페이지는 TLB라는 캐시에 저장되어 캐시가 존재할 경우 빠르게 불러올 수 있다.

요구 페이징

페이징 기법을 사용하다보니 필요한 페이지가 메모리가 아닌 디스크 상에 존재하는 경우가 생김. 따라서 필요할 때마다 메모리로 불러 들여와 실행하게 되는데 이를 요구 페이징이라 한다. 여기서 실행에 필요한 페이지들이 메모리에 더욱 오래 상주하기 위해서 자주 사용되지 않거나 필요없는 페이지를 교체해주어야 하는 알고리즘이 필요하다. 크게 FIFO, OPT, LRU,LFU 등이 있다.

  • FIFO
    • 처음 들어왔던 페이지(가장 오래된 페이지)를 새로운 페이지와 교체한다.
  • OPT
    • 앞으로 사용될 가능성이 가장 적은 페이지를 교체한다. -> 현재 메모리에 1 2 3 4 가 올라와 있고 앞으로의 사용이 1 1 2 2 3 3 3 4 1 1 2 라고 하면 가장 적게 사용될 4번 페이지를 교체한다.
    • 페이지 부재가 가장 적게 일어나 이상적이지만 페이지의 미래 사용량을 예측하여야 하므로 현실적으로 구현하기 매우 힘들다.
  • LRU
    • LRU는 가장 최근에 사용되지 않았던 페이지를 교체하는 방법이다. 메모리에 5개의 페이지가 올라올 수 있고 1 2 3 4 5 1 로 참조가 되었으면 1이 가장 오래전에 있었지만 다시 참조 되었기 때문에 2번을 교체한다.
  • LFU
    • LFU는 가장 적은 참조횟수를 가졌던 페이지를 교체하는 방법이다. 메모리에 올라와 있는 페이지의 사용량을 카운팅하여 가장 사용량이 적었던 페이지를 교체한다.

세그먼테이션

세그먼테이션은 페이징과 비슷하게 프로세스를 어떤 단위로 나눈다는 점에서 비슷하지만 세그먼테이션은 이를 논리적 단위로 나눈다는 점에서 차이가 있다. 페이징이 일정한 크기의 페이지로 나누었다면 세그먼테이션은 일반적으로 논리적 단위인 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나눈다.

세그먼테이션은 페이징과 혼합되어 사용될 수 있다.

공유하기